package com.dkd.day20250727;

import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main45 {
    //题目描述
    //一个歌手准备从A城去B城参加演出。
    //
    //按照合同，他必须在 T 天内赶到
    //歌手途经 N 座城市
    //歌手不能往回走
    //每两座城市之间需要的天数都可以提前获知。
    //歌手在每座城市都可以在路边卖唱赚钱。
    //
    //经过调研，歌手提前获知了每座城市卖唱的收入预期：
    //如果在一座城市第一天卖唱可以赚M，后续每天的收入会减少D（第二天赚的钱是 M - D，第三天是 M - 2D ...）。如果收入减少到 0 就不会再少了。
    //歌手到达后的第二天才能开始卖唱。如果今天卖过唱，第二天才能出发。
    //贪心的歌手最多可以赚多少钱？
    //
    //输入描述
    //第一行两个数字 T 和 N，中间用空格隔开。
    //
    //T 代表总天数，0 < T < 1000
    //N 代表路上经过 N 座城市，0 < N < 100
    //第二行 N+1 个数字，中间用空格隔开。代表每两座城市之间耗费的时间。
    //
    //其总和 ≤ T。
    //接下来 N 行，每行两个数字 M 和 D，中间用空格隔开。代表每个城市的输入预期。
    //
    //0 < M < 1000
    //0 < D < 100
    static int t;
    static int n;
    static int roadCost;
    static int[][] mds;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        t = sc.nextInt();
        n = sc.nextInt();

        // roadCost是A~B城市必需的路程时间
        roadCost = 0;
        for (int i = 0; i < n + 1; i++) {
            roadCost += sc.nextInt();
        }

        mds = new int[n][2];
        for (int i = 0; i < n; i++) {
            mds[i][0] = sc.nextInt();
            mds[i][1] = sc.nextInt();
        }

        System.out.println(solve());

    }

    public static int solve() {
        int remain = t -roadCost;
        if (remain <= 0) return 0;

        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> a - b);

        for(int[] md : mds) {
            int m = md[0];
            int d = md[1];
    while (m>0) {
        if (remain <= pq.size()) {
            if (pq.peek() < m) {
                pq.poll();
            } else {
                break;
            }
        }

        pq.add(m);

        m -= d;
    }
        }
        return pq.stream().mapToInt(x -> x).sum();
    }
}
